"""
name='小明'#全局作用域

def test():
    
    name='小红'
    print(f'test:{name}')
test()
print(name)
'''
test:小红
小明
'''
#像这种打印就涉及到空间了
'''
这个小红是个局部变量，当函数结束之后这个变量占用的内存是会被回收的
这就是为什么这个变量只能在函数中进行作用
出函数就被销毁了

函数被调用的时候是会被分配空间的
一但被执行完之后这个空间就会被销毁的
'''

'''
函数如果在被调用的时候会先检查自己的空间内是否存在这个变量
如果不存在的话那么这个函数就去全局进行变量的查找
'''




name='小明'#全局作用域

def test():
    global name
    name='小红'
    print(f'test:{name}')
test()
print(name)
'''
test:小红
小红
'''
#这里我们对name进行了声明了
#那么这个name 就是一个全局变量
#那么我们在函数里面进行该值的话就是对这个name进行一个重新赋值的操作
"""
'''
def outer():
    print('外部函数')
    def inner():
        print('内部函数')
outer()
'''
#外部函数
#这里仅仅只会执行外部函数的内容，并不会执行内部函数
#如果我们想调用这个内部函数我们该怎么操作呢？


#inner
#如果我们直接调用内部函数的名字是会报错的，说我们没有定义这个内部函数


'''
内部函数的空间在外部函数的里面
'''
#我们在外部函数中定义了一个内部函数，那么我们是否能直接在外部函数中直接写内部函数的调用
#那么我们调用外部函数的时候会连同内部函数一起进行调用呢？
'''
def outer():
    print('外部函数')
    def inner():
        print('内部函数')
    inner()#对内部函数的调用
outer()
'''
'''
外部函数
内部函数
'''
#理论存在，实践成立

#内部函数只能在外部函数中进行调用，我们是不能在外面进行内部函数的调用的
"""
def outer():
    print('外部函数')
    def inner():
        print('内部函数')
    return inner#返回内部函数名，返回内部函数的位置


#我们在外部函数将内部函数进行返回，那么我们在外面进行外部函数的调用的时候
#可以获取到内部函数的位置
#那么我们直接定义一个变量进行返回值的接受
i=outer()
i()
'''
外部函数
内部函数
'''


#外部函数主动将内部函数的位置暴露出来了
#我们通过这个返回值就能对内部函数进行带调用了

#那么这里的i里面存储的就是内部函数的信息
#相当与i等价于inner
#那么我们能通过这个n进行内部函数的调用

#如果不创建变量我们进行内部函数的调用的话，我们可以通过使用返回值和两个括号进行操作
outer()()
#这个就是内部函数的调用了
"""

"""
def testa():
    a=10
    def testb():
        a=100
        print(f"内部函数：{a}")
    testb()
    print(f"外部函数：{a}")

testa()
"""
'''
内部函数：100
外部函数：10

'''
'''
我们调用这个函数时，我们先创建变量a并且赋值
然后进行函数testb的创建
我们是没有进行函数testb的调用的
我们在定义完成之后我们就进行了这个函数的调用

'''

#对于这个函数里面的两个a
#我们创建的两个函数有自己对应的空间
#外部函数内部包含内部函数
#并且函数内部和外部函数的变量a是不会互相打扰的
#空间不是一个地方的
#所以这个a的值是不同的，本质上是不同的

#如果想要两个a是一个a,那么就是内部函数引用外部函数中的a

"""
def testa():
    a=10
    def testb():
        nonlocal a#声明我们内部函数用的a引用的是外部函数的a
        a=100
        print(f"内部函数：{a}")
    testb()
    print(f"外部函数：{a}")

#想在内部函数中的变量声明为外部函数的变量值---nonlocal
testa

#既然我们在内部函数内已经声明了这个内部函数引用的a是外部函数的a
#那么我们在内部函数中对a进行更改的话，那么外部函数的a也会受到影响的
"""

"""
def counter():
    count=0
    def in_count():
        nonlocal count
        #每调用一次内部函数进行+1，实现计数
        count+=1
        print(f'第{count}次')
    return in_count

c=counter()
c()
"""
'''
我们调用的是内部函数，我们每次调用完内部函数之后这个内部函数的空间就会被回收
但是我们在交互模式一直进行内部函数的调用
然后回发现这个count并没有进行清零的操作
而是在上次的基础上进行+1的操作
这是为什么呢？

因为我们调用的是内部函数，而内部函数中计数使用的是外部函数的变量
我们通过内部函数的调用使外部函数内的变量产生永久性的改变

count就没有被回收掉
'''

#匿名函数简单的使用
#lambda 参数：语句
#语句会被作为返回值的

#语句：执行语句内容，并将结果进行返回到调用处
#简单的加法操作
"""
add=lambda x,y:x+y
print(add(1,4))
#5
#我们将这个匿名函数的返回值用add进行接收
#但是这个返回值就是后面语句的方法的地址
#我们需要对这个接收返回值参数的变量进行传参的操作

#判断是否为偶数
even=lambda n:n%2==0#如果是偶数的话就会返回True
print(even(12))

#匿名函数的格式
#lambda 变量 ： 判断表达式
"""


#另外一种使用方式


li=['abcdef','123','abcd','12']
#按照元素的长度进行排序
li1=sorted(li,key=lambda w:len(w))
#['12', '123', 'abcd', 'abcdef']
print(li1)

'''
key 参数：告诉sorted()在排序的时候使用哪个函数或属性来确定每个元素的排序顺序
对于这个sorted来说的话，我们的参数可以是降序或者是升序
同样也可以是长度
我们根据这个份key进行排序
我们的排序方法默认是升序
我们的这个临时排序sorted是依照li这个参数
从li这个列表中进行排序
然后根据key进行排序
'''
'''
w接收一个元素为参数，返回元素的长度
每次从列表中选择一个元素然后在这个匿名函数中进行计算，返回这个长度作为临时排序的参数

'''






















































































































